case GDK_LEAVE_NOTIFY:
if (event->crossing.child_surface != NULL)
g_object_ref (event->crossing.child_surface);
+ if (event->crossing.related_target)
+ g_object_ref (event->crossing.related_target);
+ break;
+
+ case GDK_FOCUS_CHANGE:
+ if (event->focus_change.related_target)
+ g_object_ref (event->focus_change.related_target);
break;
case GDK_DRAG_ENTER:
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
g_clear_object (&event->crossing.child_surface);
+ g_clear_object (&event->crossing.related_target);
+ break;
+
+ case GDK_FOCUS_CHANGE:
+ g_clear_object (&event->focus_change.related_target);
break;
case GDK_DRAG_ENTER:
return event->any.target;
}
+void
+gdk_event_set_related_target (GdkEvent *event,
+ GObject *target)
+{
+ if (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY)
+ g_set_object (&event->crossing.related_target, target);
+ else if (event->any.type == GDK_FOCUS_CHANGE)
+ g_set_object (&event->focus_change.related_target, target);
+}
+
+GObject *
+gdk_event_get_related_target (const GdkEvent *event)
+{
+ if (event->any.type == GDK_ENTER_NOTIFY ||
+ event->any.type == GDK_LEAVE_NOTIFY)
+ return event->crossing.related_target;
+ else if (event->any.type == GDK_FOCUS_CHANGE)
+ return event->focus_change.related_target;
+
+ return NULL;
+}
+
/**
* gdk_event_is_sent:
* @event: a #GdkEvent
GdkNotifyType detail;
gboolean focus;
guint state;
+ GObject *related_target;
};
/*
gint16 in;
GdkCrossingMode mode;
GdkNotifyType detail;
+ GObject *related_target;
};
/*
void gdk_event_set_target (GdkEvent *event,
GObject *user_data);
GObject * gdk_event_get_target (const GdkEvent *event);
+void gdk_event_set_related_target (GdkEvent *event,
+ GObject *user_data);
+GObject * gdk_event_get_related_target (const GdkEvent *event);
#endif /* __GDK_EVENTS_PRIVATE_H__ */